package com.yunxin.customui.service;


import com.yunxin.customui.bean.UIComponent;
import com.yunxin.customui.bean.UIComponentConfig;

import java.util.function.Function;

/**
 *  自定义组件创建模板
 *  第一个泛型：getData返回的数据类型
 *  第二个泛型：组件的配置类
 *  第三个泛型：返回的组件类型
 *  第四个泛型：构造这个组件需要的参数对象
 *
 * @author LGY
 * @date 2021/09/30
 */
public abstract class CustomPageTemplate <Data , Config extends UIComponentConfig, CustomComponent extends UIComponent,Param>{

    /**
     * 获取数据
     *
     * @param config              配置
     * @param param       自定义条件对象
     */
    protected abstract Data getData(Config config , Param param);

    /**
     * 构建
     *
     * @param data   数据
     * @param config 配置
     */
    protected abstract CustomComponent build(Data data, Config config);

    /**
     * 创建组件
     *
     * @param config              配置
     * @param customFormValueBean 自定义表单条件对象
     * @param handler             处理程序
     */
    public CustomComponent createComponent(Config config, Param customFormValueBean, Function<Data,Data> handler){

        Data data = getData(config, customFormValueBean);
        if (handler!=null){
            data = handler.apply(data);
        }
        CustomComponent build = build(data, config);
        build.setCron(config.getCron());
        return build;
    }



}
